package cn.xiaosiyuan.util.COAA.genericBinary;

import java.math.BigDecimal;
import java.util.HashMap;

/**
 * 全称 GenericBinaryConvertUtil
 * 进制转换工具类
 */
public class GenericBinVerUtil {
    /**
     *
     * 目前这个方法可读性有点问题
     * 功能：
     * 把int值转换为二进制字符串
     *
     * bug:不支持负数，后面再调试
     *
     * @param value
     * @return
     */
    public static String getBinaryByInt(int value){
        StringBuilder result = new StringBuilder();

        HashMap<Integer, Object> map = new HashMap<>();

        while (value > 0){
            int e = getE(value);
            map.put(e, 0);
            String s = Math.pow(2, e) + "";
            value = value - Integer.parseInt(s.substring(0, s.length()-2));
        }



        for (int i = 100; i > 0 ; --i) {
            result.append(map.containsKey(i)?"1":"0");
        }

        if (value == 1) {
            result.append("1");
        } else if (value == 0) {
            result.append("0");
        }

        // 考虑没有有效位的时候返回0
        String s = result.toString();
        if(s.contains("1")){
            s = s.substring(s.indexOf("1"));
        }else {
            s = "0";
        }

        return s;
    }

    public static int getE(int value){
        int e = 1000;
        for (; e >= 0 ; --e) {
            double v = Math.pow(2, e);
            if(v>value){
                continue;
            }
            else break;
        }
        return e;
    }
    public static int getE(long value){
        int e = 1000;
        for (; e >= 0 ; --e) {
            double v = Math.pow(2, e);
            if(v>value){
                continue;
            }
            else break;
        }
        return e;
    }


    /**
     * 二进制转换为十进制
     * @param floatResult
     * @return
     */
    public static String binaryToDec(String floatResult) {
        BigDecimal result = new BigDecimal(0);


        // 整数部分
        String integerPart = floatResult.split("[.]")[0];
        char[] charsI = integerPart.toCharArray();
        // 比如：1 1 0 0 ，下标为0即第一个元素，是最左边的1，而不是最右边的0.（注意下标）
        int bitIndex = charsI.length - 1;
        for (int i = 0; i < charsI.length; i++,bitIndex--) {
            char c = charsI[i];
            if(c == '1'){
                String strValue = "" + bitIndex;
                result = result.add(new BigDecimal(Math.pow(2, Double.parseDouble(strValue))));
            }
        }

        // 小数部分
        String fractionalPart = floatResult.split("[.]")[1];
        char[] chars = fractionalPart.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            if(c == '1'){
                int value = i+1;
                String strValue = "-" + value;
                result = result.add(new BigDecimal(Math.pow(2, Double.parseDouble(strValue))));
            }
        }
        return result.toString();
    }


    /**
     * 把十进制转换为二进制字符串，只支持整数
     * @param value
     * @return
     */
    public static String getBinaryByLong(long value){
        StringBuilder result = new StringBuilder();

        HashMap<Integer, Object> map = new HashMap<>();

        while (value > 0){
            int e = getE(value);
            map.put(e, 0);
            String s = Math.pow(2, e) + "";
//            value = value - Integer.parseInt(s.substring(0, s.length()-2));
            value = value - (long)Math.pow(2,e);
        }



        for (int i = 100; i > 0 ; --i) {
            result.append(map.containsKey(i)?"1":"0");
        }

        if (value == 1) {
            result.append("1");
        } else if (value == 0) {
            result.append("0");
        }

        // 考虑没有有效位的时候返回0
        String s = result.toString();
        if(s.contains("1")){
            s = s.substring(s.indexOf("1"));
        }else {
            s = "0";
        }

        return s;
    }
}
